/**
 * 
 */
package br.com.upis.sispat.view;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.upis.sispat.entity.Usuario;
import br.com.upis.sispat.enums.Perfil;
import br.com.upis.sispat.enums.StatusAtivo;
import br.com.upis.sispat.exception.SeamCoreException;
import br.com.upis.sispat.exception.SeamWebException;
import br.com.upis.sispat.service.AutenticacaoService;

@Component
@Scope("singleton")
public class AutenticacaoView implements Serializable {

	/**
	 * Instantiates a new autenticacao view.
	 */
	public AutenticacaoView() {

	}

	/** The Constant serialVersionUID. */
	private static final long serialVersionUID = -2345850089470370583L;

	/** The Constant CONTEXT. */
	//public static final String CONTEXT = "/seam-apabb-web";
	public static final String CONTEXT = "";

	/** The Constant PATH_LOGIN_USUARIO. */
	public static final String PATH_LOGIN_USUARIO = CONTEXT + "/login";

	/** The Constant PATH_SALVAR_SENHA. */
	private static final String PATH_SALVAR_SENHA = CONTEXT + "/salvarSenha";

	/** The Constant PATH_GERAR_SENHA. */
	private static final String PATH_GERAR_SENHA = CONTEXT + "/gerarSenha";

	/** The Constant PATH_ALTERAR_SENHA. */
	private static final String PATH_ALTERAR_SENHA = CONTEXT + "/alterarSenha";

	/** The login. */
	private String login;

	/** The senha. */
	private String senha;

	/** The path autenticado. */
	private String PATH_AUTENTICADO = CONTEXT + "/index";

	/** The path erro autenticacao. */
	private String PATH_ERRO_AUTENTICACAO = CONTEXT
			+ "/usuario/paginaAutenticacaoErro";

	/** The usuario. */
	private Usuario usuario;

	/** The mensagem. */
	private String mensagem;

	/** The confirmacao senha. */
	private String confirmacaoSenha;

	/** The nova senha. */
	private String novaSenha;

	/** The autenticacao service. */
	@Autowired
	private AutenticacaoService autenticacaoService;

	/**
	 * Inits the.
	 */
	@PostConstruct
	public void init() {
		setUsuario(new Usuario());
		setLogin("");
		setSenha("");
		setMensagem("");
	}

	/**
	 * Autenticacao.
	 * 
	 * @return the string
	 */
	public String autenticacao() {

		this.usuario = autenticacaoService.login(login, senha);

		if (this.usuario != null) {

			if (getUsuario().getStatus().equalsIgnoreCase(
					StatusAtivo.STATUS_INATIVO.getValor())) {
				setLogin("");
				setSenha("");
				setMensagem("Esse usuário encontra-se inativo, favor contate o Administrador.");

				addMessage(FacesMessage.SEVERITY_ERROR);

				return PATH_LOGIN_USUARIO;

			}

			setLogin("");
			setSenha("");

			if (this.usuario.getSenhaGerada().equalsIgnoreCase("S")) {

				return PATH_ALTERAR_SENHA;
			}

			addUsuarioSession();

			return PATH_AUTENTICADO;

		} else {

			setLogin("");
			setSenha("");
			setMensagem("Login e/ou Senha estão incorretos.");

			addMessage(FacesMessage.SEVERITY_ERROR);

			return PATH_LOGIN_USUARIO;

		}

	}

	/**
	 * Adds the usuario session.
	 */
	private void addUsuarioSession() {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(true);

		session.setAttribute("usuarioLogado", getUsuario());
	}

	/**
	 * Alterar senha.
	 * 
	 * @return the string
	 * @throws SeamWebException
	 *             the seam web exception
	 */
	public String alterarSenha() throws SeamWebException {

		String path = null;

		if (!(getUsuario().getLogin().equals(login) && getUsuario().getSenha()
				.equals(senha))) {

			setMensagem("O campo Login/Senha não confere.");

			addMessage(FacesMessage.SEVERITY_ERROR);

			path = PATH_ALTERAR_SENHA;

		}

		if (!novaSenha.equals(confirmacaoSenha)) {
			setLogin("");
			setSenha("");
			setMensagem("O campo Senha deve ser igual a confirmação da senha.");

			addMessage(FacesMessage.SEVERITY_ERROR);

			path = PATH_ALTERAR_SENHA;
		}

		if (path != null) {
			return path;
		}

		try {
			setUsuario(autenticacaoService.changePassword(getLogin(), "",
					getNovaSenha()));
			addUsuarioSession();
		} catch (SeamCoreException e) {
			if (e.getMessage().equalsIgnoreCase("erro.usuario.inexistente")) {
				setLogin("");
				setSenha("");
				setMensagem("Usuário Inexistente.");

				addMessage(FacesMessage.SEVERITY_ERROR);
			}
			throw new SeamWebException(e);
		}

		setLogin("");
		setSenha("");
		// setMensagem("Senha enviada com sucesso.");

		// addMessage(FacesMessage.SEVERITY_INFO);

		return PATH_AUTENTICADO;
	}

	/**
	 * Gerar senha.
	 * 
	 * @return the string
	 */
	public String gerarSenha() {

		return PATH_GERAR_SENHA;
	}

	/**
	 * Gerar senha by sistema.
	 * 
	 * @return the string
	 * @throws SeamCoreException
	 *             the seam core exception
	 */
	public String gerarSenhaBySistema() throws SeamCoreException {

		autenticacaoService.createPassword(getLogin());

		setMensagem("Senha gerada e enviada por email com sucesso.");

		addMessage(FacesMessage.SEVERITY_INFO);

		return PATH_LOGIN_USUARIO;
	}

	/**
	 * Salvar senha.
	 * 
	 * @return the string
	 */
	public String salvarSenha() {

		try {
			setUsuario(autenticacaoService.changePassword(getLogin(),
					getSenha(), getNovaSenha()));

			if (getUsuario() != null) {
				addUsuarioSession();
			}

		} catch (SeamCoreException e) {

			setLogin("");
			setSenha("");
			setMensagem("Login e/ou Senha estão incorretos");

			return PATH_ERRO_AUTENTICACAO;
		}

		return PATH_SALVAR_SENHA;
	}

	/**
	 * Logoff.
	 * 
	 * @return the string
	 */
	public String logoff() {

		for (String bean : FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().keySet()) {
			FacesContext.getCurrentInstance().getExternalContext()
					.getSessionMap().remove(bean);
		}

		((HttpSession) FacesContext.getCurrentInstance().getExternalContext()
				.getSession(false)).invalidate();

		setLogin("");
		setSenha("");
		setUsuario(null);
		setMensagem("Logoff efetuado com sucesso");

		Severity severity = FacesMessage.SEVERITY_INFO;

		addMessage(severity);

		return PATH_LOGIN_USUARIO;
	}

	/**
	 * Tela inicial.
	 * 
	 * @return the string
	 */
	public String telaInicial() {
		return PATH_AUTENTICADO;
	}

	/**
	 * Adds the message.
	 * 
	 * @param severity
	 *            the severity
	 */
	private void addMessage(Severity severity) {
		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(severity, getMensagem(), getMensagem()));
	}

	/**
	 * Voltar.
	 * 
	 * @return the string
	 */
	public String voltar() {

		init();

		return PATH_LOGIN_USUARIO;
	}

	/**
	 * Iniciar.
	 * 
	 * @return the string
	 */
	public String iniciar() {
		init();

		return PATH_AUTENTICADO;
	}

	/**
	 * Gets the login.
	 * 
	 * @return the login
	 */
	public String getLogin() {
		return login;
	}

	/**
	 * Sets the login.
	 * 
	 * @param login
	 *            the login to set
	 */
	public void setLogin(String login) {
		this.login = login;
	}

	/**
	 * Gets the senha.
	 * 
	 * @return the senha
	 */
	public String getSenha() {
		return senha;
	}

	/**
	 * Sets the senha.
	 * 
	 * @param senha
	 *            the senha to set
	 */
	public void setSenha(String senha) {
		this.senha = senha;
	}

	/**
	 * Gets the usuario.
	 * 
	 * @return the usuario
	 */
	public Usuario getUsuario() {
		return usuario;
	}

	/**
	 * Sets the usuario.
	 * 
	 * @param usuario
	 *            the usuario to set
	 */
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	/**
	 * Sets the autenticacao service.
	 * 
	 * @param autenticacaoService
	 *            the autenticacaoService to set
	 */
	public void setAutenticacaoService(AutenticacaoService autenticacaoService) {
		this.autenticacaoService = autenticacaoService;
	}

	/**
	 * Gets the mensagem.
	 * 
	 * @return the mensagem
	 */
	public String getMensagem() {
		return mensagem;
	}

	/**
	 * Sets the mensagem.
	 * 
	 * @param mensagem
	 *            the mensagem to set
	 */
	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public boolean isGestor() {
		return isPerfilAutenticacao(Perfil.PERFIL_GESTOR
				.getCodigoPerfil());
	}
	
	public boolean isGerente() {
		return isPerfilAutenticacao(Perfil.PERFIL_GERENTE
				.getCodigoPerfil());
	}
	
	public boolean isFuncionario() {
		return isPerfilAutenticacao(Perfil.PERFIL_FUNCIONARIO
				.getCodigoPerfil());
	}

	public boolean isPerfilAutenticacao(Integer codigo) {
		if(usuario==null)return false;

		Integer nuPerfil = usuario.getIdAcesso();

		if (nuPerfil != null && nuPerfil.compareTo(codigo) == 0) {
			return true;
		}

		return false;
	}

	/**
	 * Gets the confirmacao senha.
	 * 
	 * @return the confirmacaoSenha
	 */
	public String getConfirmacaoSenha() {
		return confirmacaoSenha;
	}

	/**
	 * Sets the confirmacao senha.
	 * 
	 * @param confirmacaoSenha
	 *            the confirmacaoSenha to set
	 */
	public void setConfirmacaoSenha(String confirmacaoSenha) {
		this.confirmacaoSenha = confirmacaoSenha;
	}

	/**
	 * Gets the nova senha.
	 * 
	 * @return the novaSenha
	 */
	public String getNovaSenha() {
		return novaSenha;
	}

	/**
	 * Sets the nova senha.
	 * 
	 * @param novaSenha
	 *            the novaSenha to set
	 */
	public void setNovaSenha(String novaSenha) {
		this.novaSenha = novaSenha;
	}

}
